# 数据划分
import pandas as pd
from random import shuffle
datafile='/home/qnstar/Documents/datasets/model.xls'
# 读取数据  数据的前三列是特征，后一列是标签
data=pd.read_excel(datafile)
data=data.values   #将表格转换为矩阵
shuffle(data)        #随机打乱数据
train=data[:int(len(data)*0.8),:]
test=data[int(len(data)*0.8):,:]

#构建LM神经网络
from keras.models import Sequential
from keras.layers.core import Dense,Activation
netfile='/home/qnstar/Documents/tmp/net.model'
net=Sequential()                #建立神经网络
net.add(Dense(10, input_shape=(3, )))            #添加输入层（3节点）到隐藏层（10节点）的连接
net.add(Activation('relu'))     #隐藏层使用relu激活函数
net.add(Dense(1, input_shape=(10, )))            #添加隐藏层（10节点）到输出层（1节点）的连接
net.add(Activation('sigmoid'))  #输出层用sigmoid激活函数
# 编译模型，使用adam方法求解
net.compile(
        loss='binary_crossentropy',
        optimizer='adam',
        sample_weight_mode="binary")
# 训练模型，循环100次  数据的前三列是特征，后一列是标签
net.fit(train[:,:3],train[:,3],epochs=100,batch_size=1)
# 保存模型
net.save_weights(netfile)
# 预测结果 predict_classes:预测类别，predict：预测概率
predict_result=net.predict_classes(train[:,:3]).reshape(len(train))

#构建决策树
from sklearn.tree import DecisionTreeClassifier
treefile='/home/qnstar/Documents/tmp/tree.pkl'
tree=DecisionTreeClassifier()       #建立决策树模型
tree.fit(train[:,:3],train[:,3])    #训练
# 预测结果 scikit-learn的predict可以直接预测结果
predict_result2=tree.predict(train[:,:3])
#保存模型
from sklearn.externals import joblib
joblib.dump(tree,treefile)

# 评估指标
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
predict_result1 = net.predict(test[:, :3]).reshape(len(test))
fpr,tpr,thresholds=roc_curve(test[:,3],predict_result1,pos_label=1)
plt.plot(fpr,tpr,linewidth=2,label='ROC of LM')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.xlim(0,1.05)    #边界范围
plt.ylim(0,1.05)
plt.legend(loc=4)   #图例
plt.show()

plt.plot(fpr, tpr, linewidth=2, label='ROC of LM')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.ylim(0, 1.05)
plt.xlim(0, 1.05)
plt.legend(loc=4)
plt.show()
print(thresholds)

predict_result2=tree.predict_proba(test[:,:3])
fpr,tpr,thresholds=roc_curve(test[:,3],predict_result2[:,1],pos_label=1)
plt.plot(fpr,tpr,linewidth=2,label='ROC of CART')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.xlim(0,1.05)    #边界范围
plt.ylim(0,1.05)
plt.legend(loc=4)   #图例
plt.show()






